home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DDJMAG / DDJ9207.ZIP / ACOMP.ZIP / UC.ASM < prev    next >
Assembly Source File  |  1992-04-13  |  6KB  |  228 lines

  1. ;; UC.ASM        -> Uncompress ACOMP compressed audio data.
  2. ;;               Written by John W. Ratcliff, 1991.
  3. ;;               Uses Turbo Assembler IDEAL mode.
  4.  
  5.     IDEAL        ; Enter Turbo Assembler IDEAL mode.
  6.     JUMPS        ; Allow automatic jump sizing.
  7.  
  8.     INCLUDE "prologue.mac"  ; Include common useful assembly macros.
  9.  
  10. SMALL_MODEL    equ    0   ;: true only if trying to generate near calls
  11.  
  12.     SETUPSEGMENT            ; Setup _TEXT segment.
  13.  
  14. Macro    CPROC    name
  15.     public    _&name
  16. IF    SMALL_MODEL
  17. Proc    _&name    near
  18. ELSE
  19. Proc    _&name    far
  20. ENDIF
  21.     endm
  22.  
  23. SQLCH    equ    64        ; Squelch byte flag
  24. RESYNC    equ    128        ; Resync byte flag.
  25.  
  26. DELTAMOD equ    00110000b    ; Bit mask for delta mod bits.
  27.  
  28. ONEBIT    equ    00010000b    ; Bit pattern for one bit delta mod.
  29. TWOBIT    equ    00100000b    ; Bit pattern for two bit delta mod.
  30. FOURBIT equ    00110000b    ; Bit pattern for two bit delta mod.
  31.  
  32.  
  33. base    dw    ?        ; Base address inside translate table.
  34.  
  35.  
  36. TRANS    db    -8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8
  37.     db    -16,-14,-12,-10,-8,-6,-4,-2,2,4,6,8,10,12,14,16
  38.     db    -24,-21,-18,-15,-12,-9,-6,-3,3,6,9,12,15,18,21,24
  39.     db    -32,-28,-24,-20,-16,-12,-8,-4,4,8,12,16,20,24,28,32
  40.     db    -40,-35,-30,-25,-20,-15,-10,-5,5,10,15,20,25,30,35,40
  41.     db    -48,-42,-36,-30,-24,-18,-12,-6,6,12,18,24,30,36,42,48
  42.     db    -56,-49,-42,-35,-28,-21,-14,-7,7,14,21,28,35,42,49,56
  43.     db    -64,-56,-48,-40,-32,-24,-16,-8,8,16,24,32,40,48,56,64
  44.     db    -72,-63,-54,-45,-36,-27,-18,-9,9,18,27,36,45,54,63,72
  45.     db    -80,-70,-60,-50,-40,-30,-20,-10,10,20,30,40,50,60,70,80
  46.     db    -88,-77,-66,-55,-44,-33,-22,-11,11,22,33,44,55,66,77,88
  47.     db    -96,-84,-72,-60,-48,-36,-24,-12,12,24,36,48,60,72,84,96
  48.     db    -104,-91,-78,-65,-52,-39,-26,-13,13,26,39,52,65,78,91,104
  49.     db    -112,-98,-84,-70,-56,-42,-28,-14,14,28,42,56,70,84,98,112
  50.     db    -120,-105,-90,-75,-60,-45,-30,-15,15,30,45,60,75,90,105,120
  51.     db    -128,-112,-96,-80,-64,-48,-32,-16,16,32,48,64,80,96,112,127
  52.  
  53. CPROC    GetFreq         ; Report playback frequency for an ACOMP file.
  54.     ARG    SOURCE:DWORD
  55.     PENTER    0
  56.     push    es
  57.     les    bx,[SOURCE]
  58.     mov    ax,[es:bx+2]
  59.     pop    es
  60.     PLEAVE
  61.     ret
  62.     endp
  63.  
  64. ;; DX contains PREVIOUS.
  65. ;; AH contains bit mask being rotated out.
  66. ;; BX up/down 1 bit value.
  67. Macro    Delta1
  68.     LOCAL    @@UP,@@STORE
  69.     shl    ah,1    ; Rotate bit mask out.
  70.     jc    @@UP
  71.     sub    dx,bx
  72.     jns    @@STORE
  73.     xor    dx,dx    ; Zero it out.
  74.     jmp short @@STORE
  75. @@UP:    add    dx,bx
  76.     or    dh,dh
  77.     jz    @@STORE
  78.     mov    dx,255
  79. @@STORE:mov    al,dl        ; Store result.
  80.     stosb
  81.     endm
  82.  
  83. ;; BX-> base address of translate table.
  84. ;; DX-> previous.
  85. ;; AL-> index.
  86. Macro    DeModulate
  87.     LOCAL    @@HIGH,@@OK
  88.     xlat    [cs:bx] ; Translate into lookup table.
  89.     cbw        ; Make it a signed word.
  90.     add    dx,ax    ; Do word sized add, into previous.
  91.     jns    @@HIGH
  92.     xor    dx,dx    ; Underflowed.
  93. @@HIGH: or    dh,dh    ; Did it overflow?
  94.     jz    @@OK
  95.     mov    dx,255    ; Maxed out.
  96. @@OK:    mov    al,dl
  97.     stosb
  98.     endm
  99.  
  100.  
  101. ;;unsigned int      far UnCompressAudio(unsigned char far *source,unsigned char far *dest);
  102. ;; UnCompressAudio will decompress data which was compressed using ACOMP
  103. ;; into the destination address provided.  UnCompressAudio returns the
  104. ;; total size, in bytes, of the uncompressed audio data.
  105. CPROC    UnCompressAudio
  106.     ARG    SHAN:DWORD,DHAN:DWORD
  107.     LOCAL    SLEN:WORD,FREQ:WORD,FRAME:WORD,BITS:WORD = LocalSpace
  108.     PENTER    LocalSpace
  109.     PushCREGS
  110.  
  111.     lds    si,[SHAN]        ; Get source segment
  112.     les    di,[DHAN]        ; Get destination segment
  113.  
  114.     lodsw                ; Get length.
  115.     mov    [SLEN],ax        ; Save length.
  116.     mov    cx,ax            ; Into CX
  117.     lodsw                ; Frequency.
  118.     mov    [FREQ],ax        ; Save frequency
  119.     lodsb                ; Get frame size.
  120.     xor    ah,ah            ; Zero high byte
  121.     mov    [FRAME],ax        ; Save it.
  122.     lodsb                ; Get squelch, and skip it.
  123.     lodsw                ; Get maximum error, and skip it.
  124.     lodsb                ; Get initial previous data point.
  125.     stosb                ; Store it.
  126.     xor    ah,ah            ; zero high byte.
  127.     mov    dx,ax        ; Save into previous word.
  128.     dec    cx        ; Decrement total by one.
  129.     jz    @@DONE        ; Exit
  130.     mov    ah,al        ; AH, always the previous.
  131. @@DCMP: lodsb            ; Get sample.
  132.     test    al,RESYNC    ; Resync byte?
  133.     jz    @@NOTR        ; no, skip.
  134.     shl    al,1        ; Times two.
  135.     mov    dl,al        ; Into previous.
  136.     xor    dh,dh        ; Zero high word.
  137.     stosb            ; Store it.
  138.     loop    @@DCMP        ; Next one.
  139.     jmp    @@DONE
  140.  
  141. @@NOTR: test    al,SQLCH    ; Squelch byte?
  142.     jz    @@FRAM        ; no, then it is a frame.
  143.     and    al,00111111b    ; Leave just the count.
  144.     push    cx        ; Save current countdown counter.
  145.     mov    cl,al        ; get repeat count
  146.     xor    ch,ch        ; zero high byte of CX
  147.     mov    bx,cx        ; Repeat count in DX
  148.     mov    al,dl        ; Repeat of previous.
  149.     rep    stosb        ; Repeat it.
  150.     pop    cx        ; Get back remaining count.
  151.     sub    cx,bx        ; Less.
  152.     jnz    @@DCMP        ; Keep going.
  153.     jmp    @@DONE
  154.  
  155. @@FRAM:
  156.     mov    bx,ax        ; command byte into BX
  157.     and    bx,0Fh        ; Multiplier being used.
  158.     ShiftL    bx,4        ; Times 16.
  159.     add    bx,offset TRANS ; Plus address of translate table.
  160.     and    al,DELTAMOD    ; Leave just delta mod.
  161.     push    cx
  162.     mov    cx,[FRAME]    ; Get frame size.
  163.     cmp    al,ONEBIT    ; In one bit delta mod?
  164.     jne    @@NEXT1     ; no, try other.
  165.     ShiftR    cx,3        ; /8
  166.     mov    bl,[cs:bx+8]    ; Get up amount
  167.     xor    bh,bh        ; Zero high byte.
  168. @@GO:    lodsb
  169.     xchg    al,ah        ; Place prev in AL, Bit mask in AH
  170.     Delta1
  171.     Delta1
  172.     Delta1
  173.     Delta1
  174.     Delta1
  175.     Delta1
  176.     Delta1
  177.     Delta1
  178.     mov    ah,al
  179.     loop    @@GO
  180.     jmp    @@RENTER
  181.  
  182. @@NEXT1:cmp    al,TWOBIT    ; In two bit delta mod mode?
  183.     jne    @@NEXT2
  184.     add    bx,6        ; Point at +- 2 bit's in table.
  185.     shr    cx,1
  186.     shr    cx,1        ; 4 samples per byte.
  187. @@GOGO: lodsb
  188.     ShiftR    al,6
  189.     DeModulate
  190.     mov    al,[ds:si-1]
  191.     ShiftR    al,4
  192.     and    al,3
  193.     DeModulate
  194.     mov    al,[ds:si-1]
  195.     ShiftR    al,2
  196.     and    al,3
  197.     DeModulate
  198.     mov    al,[ds:si-1]
  199.     and    al,3
  200.     DeModulate
  201.     loop    @@GOGO
  202.     jmp short @@RENTER
  203. @@NEXT2:shr    cx,1        ; Two samples per byte.
  204. @@GO2:    lodsb            ; Get sample.
  205.     ShiftR    al,4
  206.     DeModulate
  207.     mov    al,[ds:si-1]
  208.     and    al,0Fh
  209.     DeModulate
  210.     loop    @@GO2
  211.  
  212. @@RENTER:
  213.     pop    cx
  214.     sub    cx,[FRAME]
  215.     jnz    @@DCMP        ; Continue decompress
  216.  
  217. @@DONE:
  218.     mov    ax,[SLEN]    ; Uncompressed length.
  219.  
  220.     PopCREGS
  221.     PLEAVE
  222.     ret
  223.     endp
  224.  
  225.  
  226.     ENDS
  227.     END
  228.